<?php

namespace app\common\model;

use think\Cache;
use think\Db;
use think\db\exception\ModelNotFoundException;
use think\db\exception\DataNotFoundException;
use think\exception\DbException;
use think\Model;

/**
 * 动态模型
 * 用于处理社区动态的增删改查功能
 * 数据表字段：
 * - id: 动态ID
 * - user_id: 发布用户ID
 * - title: 动态标题
 * - content: 动态内容
 * - media_url: 媒体文件URL
 * - media_type: 媒体类型，如image、video等
 * - like_count: 点赞数
 * - comment_count: 评论数
 * - status: 状态，normal正常，hidden隐藏
 * - createtime: 创建时间
 * - updatetime: 更新时间
 */
class Post extends Model
{

    // 表名
    protected $name = 'post';


    /**
     * 获取动态列表
     * 获取所有状态为normal的动态列表，按ID倒序排列，支持分页
     * 同时关联用户表获取发布者的昵称和头像
     * 
     * @return \think\Paginator 分页后的动态列表
     */
    public static function getPostList($where = [],$user_id)
    {
        // 查询动态列表，关联用户表获取用户信息
        $list = self::alias('p')
            ->field('p.id,p.user_id,p.title,p.content,p.media_type,p.media_url,p.like_count,p.comment_count,p.createtime,u.nickname,u.avatar')
            ->join('user u', 'u.id=p.user_id')
            ->where(function ($query) use ($where) {
                if (!empty($where['user_id'])) {
                    $query->where('p.user_id', $where['user_id']);
                }   
                $query->where('p.status', 'normal'); // 只获取状态为normal的动态
            })
            ->order('p.id', 'desc') // 按ID倒序排列，最新的动态在前
            ->paginate();
            foreach ($list as $k => &$v) {
                $v['media_url'] = !empty($v['media_url']) ? explode(',', $v['media_url']) : [];
                if ($user_id) {
                    // 调用PostLike模型的isLiked方法判断是否已点赞
                    $v['is_liked'] = PostLike::isLiked($v->id, $user_id);
                } else {
                    $v['is_liked'] = false;
                }
            }
        return $list;
    }
    
    /**
     * 获取动态详情
     * 根据动态ID获取动态的详细信息，包括：
     * 1. 动态的基本信息（标题、内容、媒体等）
     * 2. 发布者信息（昵称、头像）
     * 3. 点赞数和评论数
     * 4. 当前用户是否已点赞
     * 5. 评论列表（一级评论及其回复）
     * 
     * @param int $post_id 动态ID
     * @param int $user_id 当前用户ID，用于判断是否点赞
     * @return array|null 动态详情数组，不存在则返回null
     */
    public static function getPostDetail($post_id, $user_id = 0)
    {
        // 查询动态信息，关联用户表获取发布者信息
        $post = self::alias('p')
            ->field('p.id,p.user_id,p.title,p.content,p.media_type,p.media_url,p.like_count,p.comment_count,p.createtime,u.nickname,u.avatar')
            ->join('user u', 'u.id=p.user_id')
            ->where('p.id', $post_id)
            ->where('p.status', 'normal') // 只获取状态为normal的动态
            ->find();
            
        // 如果动态不存在或已被删除，返回null
        if (!$post) {
            return null;
        }
        
        // 将查询结果对象转为数组
        $post = $post->toArray();
        
        // 判断当前用户是否已点赞该动态
        if ($user_id) {
            // 调用PostLike模型的isLiked方法判断是否已点赞
            $post['is_liked'] = PostLike::isLiked($post_id, $user_id);
        } else {
            $post['is_liked'] = false;
        }
        $post['media_url'] = !empty($post['media_url']) ? explode(',', $post['media_url']) : [];
        // 获取评论列表（一级评论及其回复）
        // 调用PostComment模型的getCommentList方法获取评论列表
        $comments = PostComment::getCommentList($post_id);
        $post['comments'] = $comments;
        
        return $post;
    }
}
